// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "AttributeSet.h"

#include "LyraAttributeSet.generated.h"

#define UE_API LYRAGAME_API

class AActor;
class ULyraAbilitySystemComponent;
class UObject;
class UWorld;
struct FGameplayEffectSpec;

/**
 * 这个宏定义了一组用于访问和初始化属性的辅助函数。
 *
 * 宏的以下示例：
 *		ATTRIBUTE_ACCESSORS(ULyraHealthSet, Health)
 * 将创建以下函数：
 *		static FGameplayAttribute GetHealthAttribute();
 *		float GetHealth() const;
 *		void SetHealth(float NewVal);
 *		void InitHealth(float NewVal);
 */
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)

/** 
 * 用于广播属性事件的委托，其中一些参数在客户端上可能为空：
 * @param EffectInstigator	此事件的原始发起者Actor
 * @param EffectCauser		引起变化的物理Actor
 * @param EffectSpec		此变化的完整效果规格
 * @param EffectMagnitude	原始幅度，这是在钳制之前
 * @param OldValue			属性更改前的值
 * @param NewValue			更改后的值
*/
DECLARE_MULTICAST_DELEGATE_SixParams(FLyraAttributeEvent, AActor* /*EffectInstigator*/, AActor* /*EffectCauser*/, const FGameplayEffectSpec* /*EffectSpec*/, float /*EffectMagnitude*/, float /*OldValue*/, float /*NewValue*/);

/**
 * ULyraAttributeSet
 *
 *	项目的基属性集类。
 */
UCLASS(MinimalAPI)
class ULyraAttributeSet : public UAttributeSet
{
	GENERATED_BODY()

public:

	UE_API ULyraAttributeSet(); /* 构造函数声明 */

	UE_API UWorld* GetWorld() const override; /* 重写GetWorld函数声明 */

	UE_API ULyraAbilitySystemComponent* GetLyraAbilitySystemComponent() const; /* 获取LyraAbilitySystemComponent函数声明 */
};

#undef UE_API